package top.houry.sort;

import cn.hutool.core.util.StrUtil;

/**
 * @Desc
 * @Author houruiyang
 * @Date 2022/9/26
 **/
public class QuickSortS {

    public static void main(String[] args) {

//        String a = "1,2,3,4";
//        String s = StrUtil.blankToDefault(a.split(",")[8], "0");
//        System.out.println(s);

//        int[] array = new int[10];
//        for (int i = 0; i < array.length; i++) {
//            array[i] = (int) (Math.random() * 100);
//            System.out.print(array[i] + ",");
//        }
//
//        System.out.println();
//        quickSort22(array, 0, array.length - 1);
//
//        for (int i = 0; i < array.length; i++) {
//            System.out.print(array[i] + ",");
//        }
        /**
         * 分表虚拟节点数量
         */
        int virtualNodeCount = 20000;

        /**
         * 分表虚拟节点范围
         */
        String virtualNodeCountRang = "0-999,1000-1999,2000-2999,3000-3999,4000-4999,5000-5999,6000-6999,7000-7999,8000-8999,9000-9999,10000-10999,11000-11999,12000-12999,13000-13999,14000-14999,15000-15999,16000-16999,17000-17999,18000-18999,19000-19999";

        Integer mod = "3536089624895553698".hashCode() % virtualNodeCount;
        // 取绝对值
        mod = getAbsoluteValue(mod);
        // 虚拟节点范围映射到实际物理节点
        Integer shardingValue = getPhysicNodeByVisualNode(mod, virtualNodeCountRang);

        System.out.println(shardingValue);

//        Map<String, String> m = new HashMap<>(2);
//
//        m.put("11", "1");
//        m.put("12", "1");

//        System.out.println(m);

//        Timestamp timestamp = new Timestamp(System.currentTimeMillis() + 1000L * 60 * 60 * 24 * 30);
//        System.out.println("");


    }

    private static Integer getPhysicNodeByVisualNode(int mod, String virtualNodeCountRang) {
        String[] rangArr = virtualNodeCountRang.split(",");
        Integer physicCount = null;
        for (int i = 0; i < rangArr.length; i++) {
            String[] tmpArr = rangArr[i].split("-");
            if ((mod >= Integer.parseInt(tmpArr[0])) && (mod <= Integer.parseInt(tmpArr[1]))) {
                physicCount = i;
                break;
            }
        }
        return physicCount;
    }

    /**
     * 通过位运算获取一个数的绝对值, 位运算比较快
     *
     * @param value 正数或负数
     * @return 绝对值
     */
    private static Integer getAbsoluteValue(Integer value) {
        int absoluteValue = 0;
        if (value != null) {
            absoluteValue = (value + (value >> 31)) ^ (value >> 31);
        }
        return absoluteValue;
    }
//
//
//    public static void sort(int[] array, int start, int end) {
//        if (start > end) {
//            return;
//        }
//
//        int pivot = array[start];
//        int left = start;
//        int right = end;
//
//        while (left <= right) {
//            while (left <= right && array[left] < pivot) {
//                left++;
//            }
//            while (left <= right && array[right] > pivot) {
//                right--;
//            }
//
//            if (left <= right) {
//                int temp = array[left];
//                array[left] = array[right];
//                array[right] = temp;
//                left++;
//                right--;
//            }
//        }
//
//        sort(array, start, right);
//        sort(array, left, end);
//    }



    private static void quickSort22(int[] array, int begin, int end) {
        if (begin >= end) {
            return;
        }
        int pivot = array[begin];

        int left = begin;
        int right = end;

        while (left <= right) {
            while (left <= right && array[right] > pivot) {
                right--;
            }

            while ((left <= right) && array[left] < pivot) {
                left++;
            }
            if (left <= right) {
                int temp = array[left];
                array[left] = array[right];
                array[right] = temp;
                left++;
                right--;
            }
        }

        // 需要注意 left 和 right 的 取值，否则 StackOverflowError
        quickSort22(array, begin, right);
        quickSort22(array, left, end);
    }
}
